package com.fsh.wx.controller;

import com.fsh.wx.handler.WxChatMsgFactory;
import com.fsh.wx.handler.WxChatMsgHandler;
import com.fsh.wx.utils.MessageUtil;
import com.fsh.wx.utils.SHA1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Objects;

/**
 * 作者：fsh
 * 日期：2023/11/07
 * <p>
 * 描述：回调控制器 。
 *
 * 微信回调
 */
@RestController
@Slf4j
public class CallBackController {

    //只要和微信保持一致即可
    private static final String token = "fshclub";

    @Resource
    private WxChatMsgFactory wxChatMsgFactory;


    /**
     * 测试--回调消息校验--接收简单消息&自动回复消息
     */
    @PostMapping(value = "/callback",produces = "application/xml;charset=UTF-8")
    public String callback(@RequestBody String requestBody,
                           @RequestParam("signature") String signature,
                           @RequestParam("timestamp") String timestamp,
                           @RequestParam("nonce") String nonce,
                           @RequestParam(value = "msg_signature", required = false) String msgSignature) {
        log.info("get验签请求参数：requestBody:{},signature:{}，timestamp:{}，nonce:{}，echostr:{}",
                requestBody,signature, timestamp, nonce);

        //解析 requestBody
        Map<String, String> requestBodyMap = MessageUtil.parseXml(requestBody);
        //以关注为例
        String msgType=requestBodyMap.get("MsgType");
        log.info("CallBackController.class--callback()--msgType={}",msgType);//event
        //如果是event ，那么他还会有一个Event 标签--subscribe。   event不为空说明是“事件推送”,为空则是简单消息。
        String event=requestBodyMap.get("Event")==null?"":requestBodyMap.get("Event");
        log.info("CallBackController.class--callback()--Event={}",event);//event

        //因为枚举关注是  event.subscribe  , 所以拼串
        StringBuilder sb=new StringBuilder();
        sb.append(msgType);
        //为空拼接，不为空就不拼接
        if(!StringUtils.isEmpty(event)){
            sb.append(".");
            sb.append(event);
        }
        //综上，如果event不为空，那就是“事件推送”,可能就是 event.subscribe  。为空 那就可能是  text,语音图片视频等其他。
        String msgTypeKey = sb.toString();
        //获取对应实现类(当然可能获取到的是空值)
        WxChatMsgHandler wxChatMsgHandler = wxChatMsgFactory.getHandlerByMsgType(msgTypeKey);
        if(Objects.isNull(wxChatMsgHandler)){
            return "unknown";
        }
        String replay = wxChatMsgHandler.dealMsg(requestBodyMap);

        return replay;
    }




    /**
     * 测试--回调消息校验
     */
    @GetMapping("/callback")
    public String callback_1(@RequestParam("signature") String signature,
                           @RequestParam("timestamp") String timestamp,
                           @RequestParam("nonce") String nonce,
                           @RequestParam("echostr") String echostr) {
        log.info("get验签请求参数：signature:{}，timestamp:{}，nonce:{}，echostr:{}",
                signature, timestamp, nonce, echostr);
        //token 是什么无所谓 ，只要和微信保持一致就行。   encrypt:加密方式。开发的时候先采用明文
        //这里的  SHA1 就是 生成的签名工具类
        String shaStr = SHA1.getSHA1(token, timestamp, nonce, "");
        //比对签名
        if (signature.equals(shaStr)) {
            return echostr;
        }
        return "unknown";
    }
}
